﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.SqlClient;
using System.Data.Sql;
using Tibet.Datos;
using Tibet.Entidades;
using System.Web.UI.DataVisualization.Charting;
using iTextSharp.text;
using Color = System.Drawing.Color;
using Font = System.Drawing.Font;
using System.Drawing;

namespace Tibet.Logica
{
    public class Proyecto
    {

        private int _id;
        private int _nombre;
        private String _status;
        private String _lenguaje;
        private String _ruta;
        private String _miCliente;
       
        private List<DateTime> _fechas;

        //Get y Set
        public List<DateTime> Fechas
        {
            get { return _fechas; }
            set { _fechas = value; }
        }

        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public int Nombre
        {
            get { return _nombre; }
            set { _nombre = value; }
        }

        public String Status
        {
            get { return _status; }
            set { _status = value; }
        }

        public String Lenguaje
        {
            get { return _lenguaje; }
            set { _lenguaje = value; }
        }

        public String Ruta
        {
            get { return _ruta; }
            set { _ruta = value; }
        }

        public String MiCliente
        {
            get { return _miCliente; }
            set { _miCliente = value; }
        }

        //Metodos
        public bool CrearProyecto(Proyecto proyecto)
        {
            //la variable result se inicia en falso,y cambia y devuelve true sí se crea
            bool result = false;

            return true;// valor por defecto para probar caso de exit
        }

        //Método que me permite modificar el nombre dado dicho proyecto
        //la variable cambia y devuelve true sí se realiza exitosamente
        public bool ModificarNombreProyecto(int idProyecto)
        {
            bool resp=false;
            //la variable resp se inicia en falso,y cambia y devuelve true sí se crea
            return true;// valor por defecto para probar caso de exito
        }


        //Método que me permite archivar proyecto
        //Se le aplica fecha de culminación y no aparecerán como proyectos activos
        //la variable resp cambia y Devuelve true sí se ejecuta correctamente
        public bool ArchivarProyecto(int idProyecto)
        {
            bool resp=false;

            return true;// valor por defecto para probar caso de exito
        }

        //Método que me permite validar que exista un líder en un proyecto
        //Devuelve true sí se válida q existe
        public bool ValidarLider()
        {
            bool resp=false;

            return true;// valor por defecto para probar caso de exito
        }

        /// <summary>
        /// Método que me permite validar que sólo existe un cliente por proyecto
        ///la variable resp se inicialización en falso,ycambia y devuelve true
        ///sí se ejecuta exitosamente
        /// </summary>
        public bool ValidarCliente(int idProyecto)
        {
            bool resp=false;

            return true;// valor por defecto para probar caso de exito
        }
     
        public Proyecto ConsultarProyectoPorId(int id)
        {
            Proyecto proyecto = new Proyecto();
            return proyecto;
        }

        /// <summary>
        /// Este metodo llena la tabla con los errores por proyecto
        /// </summary>
        /// <param name="clave"> recibe el id de la lista</param>
        /// <returns></returns>
        public List<ErrorP> ConsultarErrorPorProyecto(int idPro, int anio)
        {
            List<ErrorP> lista = new List<ErrorP>();
            AccesoProyecto proyectoSeleccionado = new AccesoProyecto();

            lista = proyectoSeleccionado.ConsultarErroresPorProyecto(idPro, anio);

            return lista;
        }

        /// <summary>
        /// Este metodo llena la tabla con los  proyectos culmidos
        /// </summary>
        /// <param name="clave"> </param>
        /// <returns><list type="Entidades Proyecto"</returns>
        public List<Entidades.ErrorP> ConsultarProyectosCulminados()
        {

            List<Entidades.ErrorP> lista = new List<Entidades.ErrorP>();
            AccesoProyecto proyectoSeleccionado = new AccesoProyecto();

            lista = proyectoSeleccionado.ConsultarProyectosCulminados();

            return lista;
        }

        /// <summary>
        /// Este metodo llena la tabla con los  proyectos culmidos
        /// </summary>
        /// <param name="clave"> </param>
        /// <returns><list type="Entidades Proyecto"</returns>
        public List<Entidades.Proyecto> ConsultarTodosProyectosCulminados()
        {

            List<Entidades.Proyecto> lista = new List<Entidades.Proyecto>();
            AccesoProyecto proyectoSeleccionado = new AccesoProyecto();

            lista = proyectoSeleccionado.ConsultarTodosProyectosCulminados();

            return lista;
        }
      
        /// <summary>
        /// Este metodo llena la tabla con los proyectos  en curso
        /// </summary>
        /// <param name="clave"> </param>
        /// <returns></returns>
        public List<Entidades.ErrorP> ConsultarProyectosEnCurso()
        {

            List<Entidades.ErrorP> lista = new List<Entidades.ErrorP>();
            AccesoProyecto proyectoSeleccionado = new AccesoProyecto();

            lista = proyectoSeleccionado.ConsultarProyectosEnCurso();

            return lista;
        }

        /// <summary>
        /// Este metodo llena la tabla con los proyectos por cliente
        /// </summary>
        /// <param name="clave"> recibe el id de la lista</param>
        /// <returns></returns>
        public List<ErrorP> ConsultarProyectosPorCliente(int idCli)
        {

            List<ErrorP> lista = new List<ErrorP>();
            AccesoProyecto clienteSeleccionado = new AccesoProyecto();

            lista = clienteSeleccionado.ConsultarTodosProyectosPorCliente(idCli);

            return lista;
        }

        /// <summary>
        /// Método que me permite consultar todos los proyectos activos existentes
        /// </summary>
        /// <returns></returns>
        public List<Entidades.Proyecto> ConsultarProyecto()
        {
            List<Entidades.Proyecto> lista = new List<Entidades.Proyecto>();
            AccesoProyecto acceso = new AccesoProyecto();
            lista = acceso.ConsultarProyectos();
            return lista;
        }

        public void ConexionBdProyecto()
        {
            try
            {
                /*Conexcion con la base de datos*/
            }
            catch (SqlException sql)
            {
                Console.WriteLine("Se ha presentado un error en la conexion con la base de datos");
            }
            catch (Exception e)
            {
                Console.WriteLine("Ha ocurrido un error con imprevisto");
            }
        }

        public Proyecto ConsultarDatosProyecto(int id)
        {
            Proyecto proyectoActual;
            try
            {
                proyectoActual = new Proyecto();
                proyectoActual.Id = 0;                       //lo coloque asi para que la prueba pasara
                                                             //el metodo seria un select BD que me retorne un resultset
                this.ConexionBdProyecto();                   //invoca la conexion de la base de datos.
                return proyectoActual;
            }
            catch (SqlException sql)
            {
                Console.WriteLine("Se ha presentado un error en la conexion con la base de datos");
                return null;
                
            }
            catch (Exception e)
            {
                Console.WriteLine("Ha ocurrido un error con imprevisto");
                return null;
            }
            
        }

        public string ConsultaCorreoLider()
        {
            return "probando";
        }

        public void RegistrarFecha(DateTime fecha)
        {
 
        }

        public bool ModificarFecha()
        {
            return false;
        }

        public bool AplicarPerfilReglas()
        {
            return false;
        }

        public bool ValidarDesarrollador()
        {
            return true;                      //valor por defecto para que la prueba funcione(caso exito)
        }

        public bool ValidarSoloLetras()
        {
            return true;                      //valor por defecto para que la prueba funcione(caso exito)
        }

        public string BuscarFecha()             //Retorna la fecha de algun proyecto
        {
            return "01/08/2009";
        }                                       //valor por defecto para que la prueba funcione(caso exito)

        public bool ModificarNumIntegrantes()       //Metodo para modificar en numero de integrantes de un proyecto
        {
            return true;
        }                                           //valor por defecto para que la prueba funcione(caso exito)

        public bool ModificarIntegranteProyecto()   //metodo para modificar la modificacion de algun integrante en el proyecto
        {
            return true;
        }                                           //valor por defecto para que la prueba funcione(caso exito)

        public bool AplicarPerfilMetricas()         // metodo que indica si un proyecto se le agrego Perfil de Metricas
        {
            return true;
        }                                           //valor por defecto para que la prueba funcione(caso exito)

        public bool AgregarDesarrollador(Usuario desarrollador)
        {
            return true;
        }

        public bool ConsultarPerfilReglas()
        {
            return true;
        }

        public bool EliminarDesarrollador()
        {
            return true;
        }

        public bool ValidarEspacioBlanco()
        {
            return true;
        }

        public bool ModificarIntegrantesProyecto()
        {
            return true;
        }

        public bool CambiarPerfilMetricas()
        {
            return true;
        }

        public bool ModificarProyecto()
        {
            return true;
        }

        public List<ErrorP> ConsultarMetricas(int idProy, string metrica, int mesSelec)
        {
            List<ErrorP> lista = new List<ErrorP>();  
            AccesoProyecto acceso = new AccesoProyecto();
            lista = acceso.ConsultarMetricas(idProy, metrica, mesSelec);
            return lista;
        } 

        public void GraficarPorErrores(List<ErrorP>  listaErrores, string nombre, string nombreArchivo)
        {         

            int pe = 0;
            int j = 0;
            int maxcantidad = 0;
            if (listaErrores != null)
            {
                for (int i = 0; i < listaErrores.Count; i++)
                {
                    pe = listaErrores.ElementAt(i).Cant;
                    j = i;

                    if (pe > maxcantidad)
                    {
                        maxcantidad = pe;
                    }
                }
             }
            Chart myChart = new Chart();
            myChart.Height = 350;
            myChart.Width = 350;

            ChartArea myChartArea = new ChartArea();
            myChart.ChartAreas.Add(myChartArea);

            Series series = new Series("mySeries");
            if (listaErrores.Count>0)
            {
                for (int i = 0; i < listaErrores.Count; i++)
                {
                    series.Points.AddXY(listaErrores.ElementAt(i).mes, listaErrores.ElementAt(i).Cant);

                }
            }

            //System.Windows.Forms.MessageBox.Show("hola");
            myChart.Series.Add(series);

            Font font = new Font("Arial", 24, FontStyle.Bold);
            Title title = new Title();
            title.Text = nombre;
            title.Font = font;

            myChart.Titles.Add(title);

            myChart.SaveImage(@"C:\Aplicaciones\Segunda Entrega\Tibet\Tibet\ImagenesEstadistica\"+ nombreArchivo, ChartImageFormat.Png);
            //Image1.ImageUrl = @"C:\aplicaciones\test2.png";
        }

       
    }
}